package com.caregiver.watch.business.care.dao;

import com.caregiver.watch.business.care.model.po.UserPackageOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 用户套餐购买订单表数据访问接口
 */
@Mapper
public interface UserPackageOrderDao {

    /**
     * 插入订单信息
     * @param userPackageOrder 订单信息
     * @return 影响行数
     */
    int insert(UserPackageOrder userPackageOrder);

    /**
     * 根据ID更新订单信息
     * @param userPackageOrder 订单信息
     * @return 影响行数
     */
    int updateById(UserPackageOrder userPackageOrder);

    /**
     * 根据ID删除订单信息
     * @param id 订单ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Long id);

    /**
     * 根据ID查询订单信息
     * @param id 订单ID
     * @return 订单信息
     */
    UserPackageOrder selectById(@Param("id") Long id);

    /**
     * 根据订单号查询订单信息
     * @param orderNo 订单号
     * @return 订单信息
     */
    UserPackageOrder selectByOrderNo(@Param("orderNo") String orderNo);

    /**
     * 根据用户ID查询订单列表
     * @param userId 用户ID
     * @return 订单列表
     */
    List<UserPackageOrder> selectByUserId(@Param("userId") Long userId);

    /**
     * 根据支付单号查询订单信息
     * @param payNo 支付单号
     * @return 订单信息
     */
    UserPackageOrder selectByPayNo(@Param("payNo") String payNo);

    /**
     * 查询所有订单信息
     * @return 订单列表
     */
    List<UserPackageOrder> selectAll();

    /**
     * 根据条件查询订单信息列表
     * @param condition 查询条件
     * @return 订单列表
     */
    List<UserPackageOrder> selectByCondition(Map<String, Object> condition);


    /**
     * 查询生效中的订单
     * @param userId 用户ID
     * @return 订单列表
     */
    List<UserPackageOrder> selectEffectiveOrders(@Param("userId") Long userId);

    /**
     * 查询待支付的订单
     * @param orderNo 订单号
     * @return 订单信息
     */
    UserPackageOrder queryPendingPaymentOrder(@Param("orderNo") String orderNo);

    /**
     * 更新订单支付信息
     * @param id 订单ID
     * @param payNo 支付单号
     * @param payAmount 支付金额
     * @param payTime 支付时间
     * @return 影响行数
     */
    int updatePaymentInfo(@Param("id") Long id,
                          @Param("payNo") String payNo,
                          @Param("payAmount") BigDecimal payAmount,
                          @Param("payTime") LocalDateTime payTime);

    /**
     * 扣减用户预警次数
     * @param userId 用户ID
     * @param id 订单ID
     * @param oldWarningCount 旧的次数
     * @param newWarningCount 新的次数
     * @return 影响行数
     */
    int deductWarningCount(@Param("userId") Long userId,
                               @Param("id") Long id,
                               @Param("oldWarningCount") Integer oldWarningCount,
                               @Param("newWarningCount") Integer newWarningCount);

    /**
     * 查询用户预警次数
     * @param userId 用户ID
     * @param id 订单ID
     * @return 预警次数
     */
    Integer queryWarningCount(@Param("userId") Long userId, @Param("id") Long id);
}
